use apilogger::{config::Config, models::RequestLog};
use axum::{
    body::Body,
    http::{Request, StatusCode},
};
use std::sync::Arc;
use tokio::sync::Mutex;
use tower::util::ServiceExt;

#[tokio::test]
async fn test_server_integration() {
    // 加载配置
    let config = Config::new().expect("Failed to load configuration");
    
    // 创建应用状态
    let state = Arc::new(Mutex::new(Vec::<RequestLog>::new()));
    
    // 构建测试应用
    let app = apilogger::create_app(config, state.clone());
    
    // 测试 GET 请求
    let request = Request::builder()
        .uri("/api/test")
        .method("GET")
        .body(Body::empty())
        .unwrap();
    
    let response = app.clone().oneshot(request).await.unwrap();
    assert_eq!(response.status(), StatusCode::OK);
    
    // 测试 POST 请求
    let request = Request::builder()
        .uri("/api/test")
        .method("POST")
        .header("content-type", "application/json")
        .body(Body::from(r#"{"test": "data"}"#))
        .unwrap();
    
    let response = app.clone().oneshot(request).await.unwrap();
    assert_eq!(response.status(), StatusCode::OK);
    
    // 测试日志端点
    let request = Request::builder()
        .uri("/logs")
        .method("GET")
        .body(Body::empty())
        .unwrap();
    
    let response = app.oneshot(request).await.unwrap();
    assert_eq!(response.status(), StatusCode::OK);
    
    // 验证日志内容
    let body = axum::body::to_bytes(response.into_body(), 1024 * 1024).await.unwrap();
    let logs: Vec<RequestLog> = serde_json::from_slice(&body).unwrap();
    assert_eq!(logs.len(), 3); // 包括对 /logs 端点的请求
    
    // 验证第一个日志（GET 请求）
    assert_eq!(logs[0].method.as_str(), "GET");
    assert_eq!(logs[0].uri.to_string(), "/api/test");
    
    // 验证第二个日志（POST 请求）
    assert_eq!(logs[1].method.as_str(), "POST");
    assert_eq!(logs[1].uri.to_string(), "/api/test");
    assert_eq!(logs[1].body, r#"{"test": "data"}"#);
    
    // 验证第三个日志（GET /logs 请求）
    assert_eq!(logs[2].method.as_str(), "GET");
    assert_eq!(logs[2].uri.to_string(), "/logs");
} 